package com.steakliu.sun.annotation;

import com.steakliu.sun.constant.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.annotation.*;

/**
 * 功能说明： 服务引用注解
 * <p>
 * Original @Author: steakliu-刘牌, 2023-01-07  20:16
 * <p>
 * Copyright (C)2020-2022  steakliu All rights reserved.
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Autowired
public @interface SunReference {
    /**
     * 版本号
     * @return
     */
    String version() default "";
    /**
     * 分组
     * @return
     */
    String group() default "";
    /**
     * 注册中心类型
     * @return
     */
    String registryType() default RegistryConstant.EMPTY;
    /**
     * 注册中心地址
     * @return
     */
    String registryAddress() default "";
    /**
     *序列化器
     * @return
     */
    String serializer() default SerializerConstant.EMPTY;
    /**
     * 代理
     * @return
     */
    String proxy() default ProxyConstant.EMPTY;
    /**
     * 服务调用超时市场
     * @return
     */
    int timeout() default 0;
    /**
     * 是否异步调用
     * @return
     */
    boolean async() default false;
    /**
     * 是否单向调用
     * @return
     */
    boolean oneway() default false;
    /**
     * 负载均衡类型
     * @return
     */
    String loadBalance() default LoadBalanceConstant.EMPTY;
    /**
     * 结果缓存
     * @return
     */
    boolean cache() default false;
    /**
     * 缓存时长
     * @return
     */
    int cacheTime() default 0;
    /**
     * 调用失败重试次数
     * @return
     */
    int retries() default 0;
    /**
     * 重试间隔
     * @return
     */
    int retryInterval() default 0;
    /**
     * 调用服务token
     * @return
     */
    String token() default "";
    /**
     * 直连某个或者某几个服务，多个用逗号隔开如（127.0.0.1:8080,127.0.0.1:8081）
     */
    String directConnections() default "";
    /**
     * 反射类型
     */
    String reflectType() default InvokerConstant.EMPTY;
    /**
     * 服务容错调用类
     */
    Class<?> fallbackClass() default void.class;
    /**
     * 流控类型
     */
    String flowControlType() default "";
    /**
     * 是否使用流控
     */
    boolean useFlowControl() default false;
    /**
     * 并发核心线程数
     */
    int concurrentCorePoolSize() default 0;
    /**
     * 并发最大线程数
     */
    int concurrentMaximumPoolSize() default 0;
    /**
     * 是否使用限流
     */
    boolean useRateLimit() default false;
    /**
     * 限流类型
     */
    String rateLimiterType() default "";
    /**
     * 毫秒数
     */
    int milliseconds() default 0;
    /**
     * 限流每毫秒的资源数
     */
    int permits() default 0;
}
